home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 November & December / Amiga-CD 1997 #11-12.iso / pd-disketten / dms-gepackt / 5_96 / apd-5-96-2.dms / apd-5-96-2.adf / Tips&Tricks / Chip2Fast.c < prev    next >
C/C++ Source or Header  |  1996-03-12  |  4KB  |  158 lines

  1. /*
  2.    Chip2Fast  - zum Einbinden von Chip als Fast-Mem
  3.  
  4.       entstanden aus
  5.  
  6.    Arguments  -- eine CLI-Hülle für Programme ab Workbench 2.04
  7.  */
  8.  
  9. /*
  10.  *  allgemeine Include-Dateien
  11.  */
  12.  
  13. #include <string.h>
  14. #include <stdlib.h>
  15.  
  16. /*
  17.  *  spezielle Amiga-Include-Dateien
  18.  */
  19.  
  20. #include <dos/dos.h>
  21. #include <dos/rdargs.h>
  22. #include <exec/memory.h>
  23. #include <exec/types.h>
  24. #include <exec/execbase.h>
  25. #include <clib/exec_protos.h>
  26. #include <clib/dos_protos.h>
  27.  
  28. /*
  29.  * Defines, die bei einer Kopie zu ändern sind
  30.  */
  31.  
  32. #define PROGNAME "Chip2Fast"          /* Default-Name des Programms     */
  33. #define VERSION  "1.0"                /* Versions-Nummer 1.0 am Anfang! */
  34. #define AUTHOR   "David Göhler"       /* Name des Autors                */
  35. #define DATE     "28.02.96"           /* Datum der letzten Änderung     */
  36. #define ENVVAR   PROGNAME             /* Name einer ENV-Variable        */
  37.  
  38. /*
  39.  * dauerhafte define's, die kaum einer Änderung bedürfen
  40.  */
  41.  
  42. #define NAMELEN  255                  /* Länge des Programmnamens       */
  43. #define LINELEN  10000                /* Zeilenlänge im Makefile        */
  44. #define BUFLEN   200                  /* Pufferlänge für Datei-Pattern  */
  45.  
  46. /*
  47.  * Default-Optionen
  48.  */
  49.  
  50. #define DEFAULT_KBYTE     512
  51. #define DEFAULT_PRIORITY  10
  52. #define DEFAULT_TESTLEVEL 2
  53. #define DEFAULT_NAME      "Chip2Fast Memory"
  54.  
  55. /*
  56.  * falls ein GCC zum Einsatz kommt, DICE-Spezialitäten abwürgen
  57.  */
  58.  
  59. #ifdef __GNUC__
  60. #define __stkargs                     /* kennt der GCC nicht            */
  61. #endif
  62.  
  63. const char VersionID      []="$VER: " PROGNAME " " VERSION " - © " AUTHOR " " DATE;
  64. const char TemplateString []="KBYTE/N,PRI/K/N,NAME/K";
  65. // enum       TemplateEnum     { KBYTE,  PRI,    NAME};
  66.  
  67. typedef struct {
  68.        LONG *KByte;           /* wieviel KByte nehmen, default s.o. */
  69.        LONG *priority;        /* mit welcher Priority */
  70.        char *memname;         /* wie der Speicher heißen soll */
  71. } Template;                   /* Für die Kommandozeile */
  72.  
  73. ULONG kbyte;
  74. LONG  priority;
  75. char  *memname;
  76.  
  77. /*
  78.  * globale Variablen, die die Einstellungen per Kommandozeile darstellen
  79.  */
  80.  
  81. char  EnvString [BUFLEN] = "";        /* für eine eventuelle Env-Variable */
  82. char  progname  [NAMELEN]= PROGNAME;  /* Für Ausgaben bei Fehlermeldungen */
  83.  
  84. Template CommandLineVars = {          /* Template-Struktur für ReadArgs   */
  85.      0L, 0L, 0L
  86. };
  87.  
  88. /*
  89.  * externe Referenzen
  90.  */
  91.  
  92. extern struct ExecBase *SysBase;   /* Für den Versionstest */
  93.  
  94. /*
  95.  * main-Kopf, für GCC-Nutzer mit Extrawurst
  96.  */
  97.  
  98. main()
  99. {
  100.    struct RDArgs *rda;              /* nicht notwendigerweise global */
  101.    long           rc  = RETURN_OK;  /* Return-Code von main          */
  102.  
  103.    /* dies Programm läuft nur ab Version 2.04 */
  104.    if (SysBase->LibNode.lib_Version < 37)
  105.    {  Write(Output(),"Wrong kickstart version, must 37.175 or higher\n",47);
  106.       return RETURN_FAIL;
  107.    }
  108.  
  109.    /* wie heiße ich denn ? */
  110.    if (!GetProgramName(progname,NAMELEN-1))   /* bei Fehlversuch */
  111.    {  strncpy(progname,PROGNAME,NAMELEN-1); } /* Default kopieren */
  112.  
  113.    /* nun die Kommandozeilenauswertung erledigen - per Systemaufruf */
  114.    if (rda = ReadArgs ((UBYTE *)TemplateString,(LONG *) &CommandLineVars,NULL))
  115.    {
  116.       APTR chipmem;
  117.  
  118.       if (CommandLineVars.priority == 0)
  119.       {  priority = DEFAULT_PRIORITY; }
  120.       else
  121.       {  priority = *(CommandLineVars.priority); }
  122.  
  123.       if (CommandLineVars.memname == 0)
  124.       {  if (memname = AllocMem(strlen(DEFAULT_NAME)+1,MEMF_PUBLIC))
  125.          {  strncpy(memname, DEFAULT_NAME, NAMELEN-1); }
  126.          else
  127.          {  memname = 0L; }
  128.       }
  129.       else
  130.       {  if (memname = AllocMem(strlen(CommandLineVars.memname)+1,MEMF_PUBLIC))
  131.          { strncpy(memname, CommandLineVars.memname, NAMELEN-1); }
  132.          else
  133.          {  memname = 0L; }
  134.       }
  135.  
  136.       if (CommandLineVars.KByte == 0)
  137.       {  kbyte = DEFAULT_KBYTE; }
  138.       else
  139.       {  kbyte = *(CommandLineVars.KByte); }
  140.  
  141.       if (chipmem = AllocMem(kbyte*1024,MEMF_CHIP))
  142.       {  AddMemList(kbyte*1024,MEMF_PUBLIC|MEMF_FAST,priority,chipmem,memname); }
  143.       else
  144.       {  Printf("Konnte %ld KByte nicht allozieren\n",kbyte); }
  145.  
  146.       /* alloziertes wieder freigeben */
  147.       FreeArgs(rda);
  148.    }
  149.    else
  150.    {  rc = RETURN_ERROR; }
  151.  
  152.    /* bei einem Fehler, den Fehler ausgeben */
  153.    if (rc != RETURN_OK) PrintFault(IoErr(),progname);
  154.  
  155.    return rc;
  156. }
  157.  
  158.